/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package framework.db;

import framework.config.Database;
import framework.data.Usuario;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Mile
 */
/**
 * 
 * @author Darlan
 */
public class UsuarioManager
{

    private static UsuarioManager instance;

    /**
     * 
     */
    public static UsuarioManager getInstance()
    {
        if ( instance == null )
        {
            instance = new UsuarioManager();
        }

        return instance;
    }
    
    /**
     * 
     * @return
     * @throws Exception 
     */
    private Database getDatabase() throws Exception
    {
        return Database.getInstance();
    }

    /**
     *
     * @param usuario
     * @throws Exception
     */
    public void addUsuario( Usuario usuario ) throws Exception
    {
        Database db = getDatabase();
        
        usuario.setCodigo( db.getNextId( "usuarios" ) );

        try
        {
            String sql = "insert into usuarios ( " +
                    " codigo, " +
                    " login, " +
                    " senha " +
                    " ) values ( " +
                    " ?, ?, ? ) ";

            PreparedStatement st = db.prepareStatement( sql );
            int i = 1;
            st.setInt( i++, usuario.getCodigo() );
            st.setString( i++, usuario.getLogin() );
            st.setString( i++, usuario.getSenha() );

            st.execute();
            st.close();
        }

        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param usuario
     * @throws Exception 
     */
    public void updateUsuario( Usuario usuario ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = "update usuarios set " + 
                    "( " + 
                    " codigo ," +
                    " login ," +
                    " senha " +
                    " ) values ( ?, ?, ? )";
            
            PreparedStatement ps = db.prepareStatement( sql );
            
            int i = 1;
            
            ps.setInt( i++, usuario.getCodigo() );
            ps.setString( i, usuario.getLogin() );
            ps.setString( i, usuario.getSenha() );
            
            ps.execute();
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param i
     * @return
     * @throws Exception 
     */
    public List<Usuario> getUsuarios() throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = Selects.SELECT_USUARIO;
            
            PreparedStatement ps = db.prepareStatement( sql );
            
            return fetchUsuarios( ps );
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param i
     * @return
     * @throws Exception 
     */
    public Usuario getUsuario( int i ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = Selects.SELECT_USUARIO +
                    " where " +
                    " codigo = ? ";
            
            PreparedStatement ps = db.prepareStatement( sql );
            ps.setInt( 1, i );
            
            return fetchUsuario( ps );
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param i
     * @return
     * @throws Exception 
     */
    public Usuario getUsuario( String login ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = Selects.SELECT_USUARIO +
                    " where " +
                    " login = ? ";
            
            PreparedStatement ps = db.prepareStatement( sql );
            ps.setString( 1, login );
            
            return fetchUsuario( ps );
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param st
     * @return
     * @throws Exception 
     */
    private List<Usuario> fetchUsuarios( PreparedStatement st ) throws Exception
    {
        ResultSet rs = st.executeQuery();
        
        List<Usuario> usuarios = new ArrayList<Usuario>();
        
        while ( rs.next() )
        {
            Usuario usuario = new Usuario();
        
            int i = 1;
            usuario.setCodigo( rs.getInt( i++ ) );
            usuario.setLogin( rs.getString( i++ ) );
            usuario.setSenha( rs.getString( i++ ) );

            usuarios.add( usuario );
        }
        
        return usuarios;
    }
    
    /**
     * 
     * @param st
     * @return
     * @throws Exception 
     */
    private Usuario fetchUsuario( PreparedStatement st ) throws Exception
    {
        ResultSet rs = st.executeQuery();
        
        Usuario usuario = null;
        
        if ( rs.next() )
        {
            usuario = new Usuario();

            int i = 1;
            usuario.setCodigo( rs.getInt( i++ ) );
            usuario.setLogin( rs.getString( i++ ) );
            usuario.setSenha( rs.getString( i++ ) );
        }
        
        return usuario;
    }
}
